/*
 * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.sun.org.apache.xerces.internal.util;

import java.io.InputStream;
import java.io.Reader;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.sun.org.apache.xerces.internal.xni.XMLResourceIdentifier;
import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource;

/**
 * This class represents an input source for an XML resource
 * retrievable over HTTP. In addition to the properties
 * provided by an <code>XMLInputSource</code> an HTTP input
 * source also has HTTP request properties and a preference
 * whether HTTP redirects will be followed. Note that these
 * properties will only be used if reading this input source
 * will induce an HTTP connection.
 *
 * @author Michael Glavassevich, IBM
 */
public final class HTTPInputSource extends XMLInputSource {

  //
  // Data
  //

  /**
   * Preference for whether HTTP redirects should be followed.
   **/
  protected boolean fFollowRedirects = true;

  /**
   * HTTP request properties.
   **/
  protected Map fHTTPRequestProperties = new HashMap();

  //
  // Constructors
  //

  /**
   * Constructs an input source from just the public and system
   * identifiers, leaving resolution of the entity and opening of
   * the input stream up to the caller.
   *
   * @param publicId The public identifier, if known.
   * @param systemId The system identifier. This value should always be set, if possible, and can be
   * relative or absolute. If the system identifier is relative, then the base system identifier
   * should be set.
   * @param baseSystemId The base system identifier. This value should always be set to the fully
   * expanded URI of the base system identifier, if possible.
   */
  public HTTPInputSource(String publicId, String systemId, String baseSystemId) {
    super(publicId, systemId, baseSystemId);
  } // <init>(String,String,String)

  /**
   * Constructs an input source from a XMLResourceIdentifier
   * object, leaving resolution of the entity and opening of
   * the input stream up to the caller.
   *
   * @param resourceIdentifier the XMLResourceIdentifier containing the information
   */
  public HTTPInputSource(XMLResourceIdentifier resourceIdentifier) {
    super(resourceIdentifier);
  } // <init>(XMLResourceIdentifier)

  /**
   * Constructs an input source from a byte stream.
   *
   * @param publicId The public identifier, if known.
   * @param systemId The system identifier. This value should always be set, if possible, and can be
   * relative or absolute. If the system identifier is relative, then the base system identifier
   * should be set.
   * @param baseSystemId The base system identifier. This value should always be set to the fully
   * expanded URI of the base system identifier, if possible.
   * @param byteStream The byte stream.
   * @param encoding The encoding of the byte stream, if known.
   */
  public HTTPInputSource(String publicId, String systemId,
      String baseSystemId, InputStream byteStream, String encoding) {
    super(publicId, systemId, baseSystemId, byteStream, encoding);
  } // <init>(String,String,String,InputStream,String)

  /**
   * Constructs an input source from a character stream.
   *
   * @param publicId The public identifier, if known.
   * @param systemId The system identifier. This value should always be set, if possible, and can be
   * relative or absolute. If the system identifier is relative, then the base system identifier
   * should be set.
   * @param baseSystemId The base system identifier. This value should always be set to the fully
   * expanded URI of the base system identifier, if possible.
   * @param charStream The character stream.
   * @param encoding The original encoding of the byte stream used by the reader, if known.
   */
  public HTTPInputSource(String publicId, String systemId,
      String baseSystemId, Reader charStream, String encoding) {
    super(publicId, systemId, baseSystemId, charStream, encoding);
  } // <init>(String,String,String,Reader,String)

  //
  // Public methods
  //

  /**
   * Returns the preference whether HTTP redirects should
   * be followed. By default HTTP redirects will be followed.
   */
  public boolean getFollowHTTPRedirects() {
    return fFollowRedirects;
  } // getFollowHTTPRedirects():boolean


  /**
   * Sets the preference whether HTTP redirects should
   * be followed. By default HTTP redirects will be followed.
   */
  public void setFollowHTTPRedirects(boolean followRedirects) {
    fFollowRedirects = followRedirects;
  } // setFollowHTTPRedirects(boolean)

  /**
   * Returns the value of the request property
   * associated with the given property name.
   *
   * @param key the name of the request property
   * @return the value of the request property or <code>null</code> if this property has not been
   * set
   */
  public String getHTTPRequestProperty(String key) {
    return (String) fHTTPRequestProperties.get(key);
  } // getHTTPRequestProperty(String):String

  /**
   * Returns an iterator for the request properties this
   * input source contains. Each object returned by the
   * iterator is an instance of <code>java.util.Map.Entry</code>
   * where each key and value are a pair of strings corresponding
   * to the name and value of a request property.
   *
   * @return an iterator for the request properties this input source contains
   */
  public Iterator getHTTPRequestProperties() {
    return fHTTPRequestProperties.entrySet().iterator();
  } // getHTTPRequestProperties():Iterator

  /**
   * Sets the value of the request property
   * associated with the given property name.
   *
   * @param key the name of the request property
   * @param value the value of the request property
   */
  public void setHTTPRequestProperty(String key, String value) {
    if (value != null) {
      fHTTPRequestProperties.put(key, value);
    } else {
      fHTTPRequestProperties.remove(key);
    }
  } // setHTTPRequestProperty(String,String)

} // class HTTPInputSource
